package com.hb.A_基础.B_高阶函数和lambda

data class Country(val name:String,val continent:String,val population:Int)

class CountryApp{
    //获取欧洲的所有国家
    fun filterCountries(countries:List<Country>):List<Country>{
        val res = mutableListOf<Country>()
        for (country in countries) {
            if (country.continent == "EU"){
                //EU代表欧洲
                res.add(country)
            }
        }
        return  res
    }

    //根据具体的州来筛选国家
    fun filterCountries(countries:List<Country>,continent:String):List<Country>{
        val res = mutableListOf<Country>()
        for (country in countries) {
            if (country.continent == continent){
                res.add(country)
            }
        }
        return  res
    }

    //具有一定人口规模的国家
    fun filterCountries(countries:List<Country>,continent:String,population:Int):List<Country>{
        val res = mutableListOf<Country>()
        for (country in countries) {
            if (country.continent == continent && country.population >population){
                res.add(country)
            }
        }
        return  res
    }

    /**
     * 如果按照现有的设计，更多的筛选条件会作为方法参数而不断累加，而且业务逻辑也高度耦合
     * 解决问题的核心在于对filterCountries方法进行解耦，我们能否把所有的筛选逻辑行为都抽象成一个参数呢？
     * Kotlin是支持高阶函数的，理论上我们同样可以把筛选的逻辑变成一个方法来传入，这种思路更加简单。
     *
     * 怎么样才能把这个方法变成filterCountries方法的一个参数呢？要实现这一点似乎要先解决以下两个问题：
     *  1. 方法作为参数传入，必须像其他参数一样具备具体的类型信息
     *  2. 需要把xxx方法的引用当做参数传递给filterCountries
     */

}